﻿//题目描述
//任何一个有理数都可以表示成M / N的形式（M, N均为正整数）。例如1 / 2, 2 / 4, 3 / 6都是等值的有理数。给定若干有理数，等值有理数的值只能算一个，问这些有理数含有多少个值，并按从小到大输出各值及该值的有理数个数。
//
//输入
//第一行是整数n, 表示随后有n组测试数据（n不超过10）。
//
//每一组测试数据的第一行是一个整数m(m <= 100000)，随后有m行，每一行都是A / B的形式, 1 <= A, B <= 1000000000
//
//输出
//对于每一组测试数据，输出要求如下，第一行输出有理数值的个数p，随后的p行按从小到大的次序每一行输出一个A / B形式的值及其对应的有理数个数，用空格分开，要求A / B是最简分数。
//
//样例输入 Copy
//2
//2
//1 / 3
//1 / 4
//4
//1 / 1
//1 / 2
//7 / 14
//7 / 7
//样例输出 Copy
//2
//1 / 4 1
//1 / 3 1
//2
//1 / 2 2
//1 / 1 2

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <algorithm>
#include<cstdio>
using namespace std;

const int N = 100010;

struct fens {
	int a, b;
	double res;

}stu[N];

int gcd(int a, int b)
{
	if (a < b) swap(a, b);
	while (a % b)
	{
		int r = a % b;
		a = b;
		b = r;
	}
	return b;
}

bool cmp(fens x, fens y)
{
	return x.res < y.res;
}

int main()
{
	int c[N] = { 0 }, d[N];
	int n,m;
	scanf("%d", &n);
	while (n--)
	{
		cin >> m;
		int x;
		for(int i=0;i<m;i++)
		{
			scanf("%d/%d", &stu[i].a, &stu[i].b); //输入
		}

		for (int i = 0; i < m; i++)//化简
		{
			x = gcd(stu[i].a, stu[i].b);
			stu[i].a /= x;
			stu[i].b /= x;
			stu[i].res = stu[i].a *1.0/ stu[i].b;  //1.0必须要乘
		}
		sort(stu, stu + m, cmp);

		int j = 0, k = 0;
		c[0] = 1;
		for (int i = 0; i < m; i++)
		{
			if (stu[i].a == stu[i + 1].a && stu[i].b == stu[i + 1].b)
			{
				c[j]++;//计算数量
			}

			else
			{
				d[j++] = i;//记录不同的分式
				c[j] = 1;//刷新数量
				k = j;//计算不同的分式数量
			}
		}
		c[j] = '\0';
		printf("%d\n", k);
		for (int i = 0; c[i]; i++)
		{
			printf("%d/%d %d\n", stu[d[i]].a, stu[d[i]].b, c[i]);
		}
	}
	return 0;
}